本文章同時發佈於:
大家好,繼上次Week23 - 用Minecraft來說明Docker為什麼這麼香 - 概念篇的文章後,接下來要來實作用Docker
啟動Minecraft Server
。
Docker
安裝的部分在Docker
的官網都寫得很清楚了,由於本篇主要討論實作而不是安裝,我這邊就把三種系統的安裝介紹都貼上來,不說明此部分了~
Docker
內啟動Minecraft Server
首先,我們運行:
docker run -p 25565:25565 superj80820/minecraft-server
然後...就沒有然後了,因為Minecraft Server
起好了!
你可能會說:等等!我都不用設置些什麼嗎?比如說Minecraft Server
的參數,我連的Server
的主程式jar
都沒下載耶!?
是的,這就是Docker
的好處,如上篇所述,Docker
可以把需要隔離的的檔案放入裡頭,就像放到資料夾裡,而這資料夾實際上就是一個Docker Image
。
Docker
又提供了Dockerhub供大家放置Docker Image
,我們可以直接下載執行。
所以猜到了嗎?我只是把Minecraft Server
這些必備條件打包成Docker Image
並上傳至Dockerhub
而已:
既然已經起好Minecraft Server
了,那本文章就到此結束...喂!才沒有XD
我們接下來好好介紹要怎麼打包Dokcer Image
Dockerfile
來打包Docker Image
首先可以透過Git
來Clone
完整範例
再用Terminal
進入week24
資料夾
$ cd week24
會看到此資料夾有以下幾個檔案
Docker Image
Minecraft Server
的參數配置檔Minecraft Server
的主程式,可以至官網下載讓我們來看看Dockerfile
裡頭是怎麼表示Minecraft Server
的運作條件:
# Server執行的環境,我們選用JDK 8
FROM openjdk:8
# Server所需的程式檔與配置,此指令是把week24資料夾所有的檔案都複製到Docker Image裡的/usr/src/myapp資料夾
COPY . /usr/src/myapp
# 說明Minecraft Server在Docker裡運行時的目錄
WORKDIR /usr/src/myapp
# Server執行的方式,我這邊就是把官網的執行指令複製下來而已
CMD ["java", "-Xmx1024M", "-Xms1024M", "-jar", "server.jar", "nogui"]
了解Dockerfile
後,我們來打包Docker Image
,
.
的意思就是指「透過此目錄底下的Dockerfile
」來打包-t
的意思就是指此Image
的名字要取什麼$ docker build . -t=minecraft-server
最後運行打包好的Docker Image
,我們需要用-p
這個參數把Docker
內部的Minecraft Server
的25565 port
與本機電腦的25565 port
做連接,這樣我們才能在Minecraft
裡透過localhost:25565
連入Docker
內部的Minecraft Server
$ docker run -p 25565:25565 minecraft-server
這樣就可以啦~趕快連入Minecraft Server
開玩吧!
如果想要把Docker Image
放到Dockerhub上,你必須先在Dockerhub上註冊帳號,並在Terminal
登入:
$ docker login
輸入完帳號密碼登入完畢後,我們要特別在Docker Image
的名子裡裡標示自己的帳號,在Push
上Dockerhub:
$ docker build . -t={帳號}/minecraft-server
$ docker push {帳號}/minecraft-server
以我的帳號來說就要這樣下指令:
$ docker build . -t=superj80820/minecraft-server
$ docker push superj80820/minecraft-server
Docker
以後的有趣世界在實作了Docker
版的Minecraft Server
之後,我來整理一下剛剛我們在Docker
上獲得的好處。
白話來講就是:
先讓程式可以動,如果有需求在客製化邏輯,如果有需求再優化程式運行速度
就是先求有再求好啦XD,在現在很多很多的Open source
之中,我們會很常碰到要「跨語言」的問題。
當語言變換,我們甚至連「讓程式可以動」都變成了一件很難的事,因為我們要去了解這個語言的許多配置與安裝。
比如說小弟我主要是學習Javascript
與Golang
的,但這時候要架設用Java
語言設計的Jenkins CI
,以往我就要先安裝Java
,並且學習Java
架設Server
的方式。
但現在我只要下此指令Docker
就起好了:
$ docker run jenkins/jenkins
就可以去泡咖啡了吃零食了~
你會發現很多的Open source
都會提供Docker
,比如go-micor, nginx等。
你可以用很低的成本去轉換不同語言,畢竟「先讓程式可以動,再去了解細節」是更加直觀的。
由於有了Docker
將Server
的運作條件都打包起來,所以快速啟動Server
在電腦上變成了很簡單的事情,
這導致後端從「Server常駐在電腦上」變為「依照不同的流量需求啟動不同數量的Server」
由於有了Docker
將Server
的隔離變得簡單:
這導致後端從「單一個Server眾多邏輯」變為「多個職責單一的Server分享邏輯」
這次實作了Minecraft Server
的Docker Image
容器化,下回將會介紹如何透過Docker Compose
來管理多個Docker
以達到此系列一開始「單個電腦,多個Minecraft Server
」的需求~
謝謝你的閱讀,也歡迎分享討論指正~